package com.zp.self.module.level_4_算法练习.数学.位运算;

import org.junit.Test;

/**
 * @author By ZengPeng
 */
public class 力扣_137_只出现一次的数字II {
    @Test
    public void main() {

        System.out.println(maxProfit(new int[]{-2,-2,-3,-2}));
        System.out.println(maxProfit(new int[]{2,2,3,2}));
    }

    /**
    题目：给你一个整数数组 nums ，除某个元素仅出现 一次 外，其余每个元素都恰出现 三次 。
          请你找出并返回那个只出现了一次的元素。

     示例 1：
     输入：nums = [2,2,3,2]
     输出：3

     示例 2：
     输入：nums = [0,1,0,1,0,1,99]
     输出：99
      
     进阶：你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗？

    分析：【P 💔💔💔】
       1.位与： 不断位与 1，再>> .得到32的总和 arr[32]，
                再对32位%3==0？ 不能整除3说明目标数次位为1 ; 不断<< 再 异或1  将1补上去
                --执行用时：1 ms, 在所有 Java 提交中击败了89.91%的用户
                --耗时：超过30分钟
       大神：这里有更好的算法 --复习时再来看看吧

    边界值 & 注意点：
       1.
     **/
    public int maxProfit(int[] nums) {
        int[] arr = new int[32];
        for (int num : nums) {
            for (int j = 0; j < 32; j++)//这里是：低位在前，高位在后  为1
                arr[j] += ((num >>> j) & 1);
        }
        int res=0;
        for (int i = 31; i >=0; i--) {
            res =res<<1;
            if(arr[i]%3!=0)
                res^=1;
        }
        return res;
    }
}
